//
//  File.swift
//  HeadlineNews
//
//  Created by han on 2019/7/1.
//  Copyright © 2019 han. All rights reserved.
//

import Foundation

// 国际化设置app的语言。实现app内切换国际化语言。
// app第一次打开时，判断当前设备是什么语言，设置成app语言为当前设备语言，并保存在本地。
// 之后app打开，根据本地保存语言显示。（如果设定为非跟随系统，之后手机系统切换语言，app也不会切换语言）
// 当app内切换语言时，切换显示语言，并保存

let kLanguageUserSettings = "LanguageUserSettings"

enum HeadlineLanguages: String {
    case Follow = "follow" // 跟随系统,默认
    case Chinese = "zh-Hans"
    case English = "en"
    
    enum SystemLanguages: String { // 实际显示的语言
        case Chinese = "zh-Hans"
        case English = "en" // 默认是英文
    }
    
    // 用来保存用到语言的bundle
    static var languageBundles: [String: Foundation.Bundle] = [:]
    
    /// 当前设置的手机语言
    static var currentSetting: HeadlineLanguages = .Follow
    // 手机显示的语言
    static var language: SystemLanguages = .English
    
    /// 切换手机语言
    static func switchTo(_ language: HeadlineLanguages) {
        currentSetting = language
        UserDefaults.set(language.rawValue, forKey: kLanguageUserSettings)
        if language == .Follow { // 设置为跟随系统
            self.language = systemLanguage()
        } else { // 设置为特定语言
            self.language = SystemLanguages(rawValue: language.rawValue)!
        }
        NotificationCenter.default.post(Notification(name: languageChangedNotification, object: nil, userInfo: ["language": language]))
    }
    
    // 初始化当前语言
    static func initCurrentLanguage() {
        // 设置本地数据设置当前语言
        if let savedString = UserDefaults.object(forKey: kLanguageUserSettings) as? String,let savedLanguage = HeadlineLanguages(rawValue: savedString) {
            switchTo(savedLanguage)
        } else { // 本地没有缓存数据，则设置为跟随系统
            switchTo(.Follow)
        }
        // 设置bundle
        object_setClass(Foundation.Bundle.main, Bundle.self)
    }
    
    // 获取到系统语言
    static func systemLanguage() -> SystemLanguages {
        if localeIsChinese() {
            return .Chinese
        } else {
            return .English
        }
    }

    /// 判断手机语言是不是中文
    static func localeIsChinese() -> Bool {
        if let lang = Locale.preferredLanguages.first {
            return lang.hasPrefix("zh") ? true : false ;
        } else {
            return false
        }
    }
}

// 根据语言获取到语言bundle
extension HeadlineLanguages.SystemLanguages {
    var bundle: Foundation.Bundle? {
        /// 存起来, 避免一直创建
        if let bundle = HeadlineLanguages.languageBundles[rawValue] {
            return bundle
        } else {
            let mainBundle = Foundation.Bundle.main
            if let path = mainBundle.path(forResource: rawValue, ofType: "lproj"),
                let bundle = Foundation.Bundle(path: path) {
                HeadlineLanguages.languageBundles[rawValue] = bundle
                return bundle
            } else {
                return nil
            }
        }
    }
}

/// 首先, 我们会在启动时设置成我们自己的Bundle,这样就可以做到,当使用时会调用这个方法.
class Bundle: Foundation.Bundle {
    override func localizedString(forKey key: String, value: String?, table tableName: String?) -> String {
        if let bundle = HeadlineLanguages.language.bundle {
            return bundle.localizedString(forKey: key, value: value, table: tableName)
        } else {
            return super.localizedString(forKey: key, value: value, table: tableName)
        }
    }
}

extension HeadlineLanguages {
    static let languageChangedNotification = NSNotification.Name("languageChangedNotification")
}

/**
 // didFinishLaunching中 设置默认语言和语言包
  HeadlineLanguages.initCurrentLanguage()

 // storyboard 是rootVC时，需要重新设置一下RootViewController
 func resetRootViewController() {
 if let appdelegate = UIApplication.shared.delegate {
 let storyBoard = UIStoryboard.init(name: "Main", bundle: nil)
 if let mainController = storyBoard.instantiateViewController(withIdentifier: "rootViewController") as? UINavigationController {
 appdelegate.window??.rootViewController = mainController
 }
 }
 }
 
 // 使用
 // comment 是传参, 假如你的value 中需要外界来决定内容,可以用%@,然后comment传参.
 NSLocalizedString("key", comment: "")
 
 //切换语言时,只要设置就可以:
 HeadlineLanguages.switch

 // 切换语言时，可以将RootViewController全部切换掉，也可以接受通知，将VC updateUI
 */
